package com.bw.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.bw.common.GiteeUtils;
import com.bw.common.JwtUtils;
import com.bw.common.Md5Utils;
import com.bw.common.TokenUtils;
import com.bw.entity.User;
import com.bw.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

//@Controller
public class GiteeLoginController {


    @Autowired
    UserMapper userMapper;


    /**
     * 用来接收 临时授权
     * 用来接收gitee系统发过来的临时授权码
     *
     *
     * @return
     */
    @RequestMapping("/callbackCode.do")
    public String loginPage(String code, HttpServletResponse response){

        System.out.println("接收到的临时授权码：" + code);

        // 2. 根据临时授权码 获取token （通过远程的http调用，访问gitee的服务器）
        String tokenByCode = GiteeUtils.getAccessTokenByCode(code);

        System.out.println("根据临时授权码获取到的 token" + tokenByCode);

        //3. 根据token获取gitee用户信息 (（通过远程的http调用，访问gitee的服务器）)
        JSONObject userInfoByToken = GiteeUtils.getGiteeUserInfoByToken(tokenByCode);
        System.out.println("根据token获取到的gitee用户信息 " + JSON.toJSONString(userInfoByToken));

        // gitee 返回的用户信息太多了
        //只选择4个重要的字段进行注册
        //把gitee 账号昵称当做咱们自己系统的用户昵称
        String nickName = userInfoByToken.getString("name");

        //把gitee 账号 个人空间地址 当做咱们自己系统的用户名
        String name = userInfoByToken.getString("login");

        //把gitee 账号 头像 当做咱们自己系统的用户头像
        String avatarUrl = userInfoByToken.getString("avatar_url");

        //把gitee 账号id 当做咱们自己系统的用户 的giteeId
        Integer giteeId = userInfoByToken.getInteger("id");

        // 判断之前是否已经注册过 (根据个人空间地址去查询用户)
        User userFromDB =   userMapper.selectByName(name);

        if (userFromDB == null){ // 之前没有注册过，则执行注册流程
            User user = new User();
            user.setName(name);
            user.setNickName(nickName);
            user.setAvatarUrl(avatarUrl);
            user.setGiteeId(giteeId);

            // 给这个用户设置一个默认密码
            String pwd = "123456";
            String salt = UUID.randomUUID().toString().substring(0, 8);
            String md5String = Md5Utils.getMD5String(pwd + salt);

            user.setSalt(salt);
            user.setPwd(md5String);

            userMapper.add(user);

            // 加密用户信息 得到令牌 把令牌放入cookie    通过response把cookie返回给浏览器
            TokenUtils.responseTokenByCookie(user,response);
        }else {
            // 如果之前已经注册过 ，则刷新一下 用户的昵称和头像 （ 修改这个用户的昵称和头像）
            userFromDB.setAvatarUrl(avatarUrl);
            userFromDB.setNickName(nickName);
            userMapper.updateUser(userFromDB);

            // 加密用户信息 得到令牌 把令牌放入cookie    通过response把cookie返回给浏览器
            TokenUtils.responseTokenByCookie(userFromDB,response);

        }
        // 重定向： 告诉浏览器接下来去访问success.do
        return "redirect:list.do";
    }



}
